package com.sunday.common.http.vertx;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Launcher;
import io.vertx.core.http.HttpServerResponse;
import io.vertx.ext.web.Route;
import io.vertx.ext.web.Router;
import lombok.extern.slf4j.Slf4j;

/**
 * https://github.com/vert-x3/vertx-examples/blob/4.x/web-examples/src/main/java/io/vertx/example/web/helloworld/Server.java
 * https://vertx.io/docs/vertx-web/java/
 */
@Slf4j
public class Server extends AbstractVerticle {

    public static void main(String[] args) {
        Launcher.executeCommand("run", Server.class.getName());
    }

    @Override
    public void start() throws Exception {

        /**
         * Vert.x-Web 的核心概念之一。它是一个保持零或多的对象。 RouterRoutes
         * 路由器将暂停传入的 ，以确保请求正文或任何 协议升级不会丢失。其次，它将为该请求找到第一个匹配的路由，并传递该请求 到那条路线。
         * HttpServerRequest
         */
        Router router = Router.router(vertx);

        handler(router);
        chunked(router);

        vertx.createHttpServer().requestHandler(router).listen(8080);
    }

    /**
     * 处理请求并调用下一个处理程序
     * https://vertx.io/docs/vertx-web/java/#_handling_requests_and_calling_the_next_handler
     */
    protected void chunked(Router router) {

        Route route = router.route("/some/path");
        route.handler(ctx -> {

            HttpServerResponse response = ctx.response();
            //启用分块响应，因为我们将添加数据作为
            //我们在其他处理程序上执行。这只需要一次和
            //仅当多个处理程序输出时。
            response.setChunked(true);

            response.write("route1\n");

            // 延迟5秒后调用下一个匹配路由
            ctx.vertx().setTimer(5000, tid -> ctx.next());
        });

        route.handler(ctx -> {

            HttpServerResponse response = ctx.response();
            response.write("route2\n");

            // 延迟5秒后调用下一个匹配路由
            ctx.vertx().setTimer(5000, tid -> ctx.next());
        });

        route.handler(ctx -> {

            HttpServerResponse response = ctx.response();
            response.write("route3");

            // Now end the response
            ctx.response().end();
        });
    }


    /**
     * Vert.x-Web 的基本概念
     * https://vertx.io/docs/vertx-web/java/#_basic_vert_x_web_concepts
     */
    protected void handler(Router router) {
        router.route("/base").handler(routingContext -> {

            // 每个请求都将调用此处理程序
            HttpServerResponse response = routingContext.response();
            response.putHeader("content-type", "text/html");

            // 写下回应并结束它
            response.end("Hello World! -> " + System.currentTimeMillis());
        });
    }
}